package com.c2b.algorithm.leetcode.base;

/**
 * <a href='https://leetcode.cn/problems/rings-and-rods/'>环和杆(Rings and Rods)</a>
 * <p>总计有 n 个环，环的颜色可以是红、绿、蓝中的一种。这些环分别穿在 10 根编号为 0 到 9 的杆上。</p>
 * <p>
 * 给你一个长度为 2n 的字符串 rings ，表示这 n 个环在杆上的分布。rings 中每两个字符形成一个 颜色位置对 ，用于描述每个环：
 *     <ul>
 *         <li>第 i 对中的 第一个 字符表示第 i 个环的 颜色（'R'、'G'、'B'）。</li>
 *         <li>第 i 对中的 第二个 字符表示第 i 个环的 位置，也就是位于哪根杆上（'0' 到 '9'）。</li>
 *     </ul>
 * </p>
 * <p>例如，"R3G2B1" 表示：共有 n == 3 个环，红色的环在编号为 3 的杆上，绿色的环在编号为 2 的杆上，蓝色的环在编号为 1 的杆上。</p>
 * <p>找出所有集齐 全部三种颜色 环的杆，并返回这种杆的数量。</p>
 *
 * <p>
 * <b>示例：</b>
 * <pre>
 * 示例 1：
 *      输入：rings = "B0B6G0R6R0R6G9"
 *      输出：1
 *      解释：
 *          - 编号 0 的杆上有 3 个环，集齐全部颜色：红、绿、蓝。
 *          - 编号 6 的杆上有 3 个环，但只有红、蓝两种颜色。
 *          - 编号 9 的杆上只有 1 个绿色环。
 *          因此，集齐全部三种颜色环的杆的数目为 1 。
 *
 * 示例 2：
 *      输入：rings = "B0R0G0R9R0B0G0"
 *      输出：1
 *      解释：
 *          - 编号 0 的杆上有 6 个环，集齐全部颜色：红、绿、蓝。
 *          - 编号 9 的杆上只有 1 个红色环。
 *          因此，集齐全部三种颜色环的杆的数目为 1 。
 *
 * 示例 3：
 *      输入：rings = "G4"
 *      输出：0
 *      解释：
 *          只给了一个环，因此，不存在集齐全部三种颜色环的杆。
 * </pre>
 * </p>
 *
 * <p>
 * <b>提示：</b>
 * <ul>
 *     <li>rings.length == 2 * n</li>
 *     <li>1 <= n <= 100</li>
 *     <li>如 i 是 偶数 ，则 rings[i] 的值可以取 'R'、'G' 或 'B'（下标从 0 开始计数）</li>
 *     <li>如 i 是 奇数 ，则 rings[i] 的值可以取 '0' 到 '9' 中的一个数字（下标从 0 开始计数）</li>
 * </ul>
 * </p>
 *
 * @author c2b
 * @since 2024/1/19 10:36
 */
public class LC2103RingsAndRods_S {

    static class Solution {
        public int countPoints(String rings) {
            int length = rings.length();
            if (length < 6) {
                return 0;
            }
            // 用长度为10的数组，记录 编号为0-9的杆。
            // 杆上环的颜色分别用：1<<0，1<<1，1<<2表示，即集齐 全部三种颜色 环的杆对应的值为： 00000111
            int[] cnt = new int[10];
            char[] chars = rings.toCharArray();
            for (int i = 0; i < length; i += 2) {
                int index = chars[i + 1] - '0';
                switch (chars[i]) {
                    case 'R':
                        cnt[index] |= 1;
                        break;
                    case 'G':
                        cnt[index] |= (1 << 1);
                        break;
                    case 'B':
                        cnt[index] |= (1 << 2);
                        break;
                }
            }
            int res = 0;
            for (int i : cnt) {
                // 1 | 1 << 1 | 1 << 2 ：即7
                res += i == 7 ? 1 : 0;
            }
            return res;
        }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.countPoints("B0B6G0R6R0R6G9"));
        System.out.println(solution.countPoints("B0R0G0R9R0B0G0"));
        System.out.println(solution.countPoints("G4"));
    }
}
